package com.davidlife.javase.javaio;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ObjectStreamAndSerializable {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writeObject();
        readObject();
        System.out.println("==========================");
        TestPrintStream();
    }

    private static void writeObject() throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("ser.txt"));
        List<Person> objs = new ArrayList<>();
        objs.add(new Person("赵丽颖", 18));
        objs.add(new Person("冯绍峰", 20));
        objs.add(new Person("盛宏", 40));
        oos.writeObject(objs);
        oos.flush();
        oos.close();
    }

    private static void readObject() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("ser.txt"));
        ArrayList<Person> objs = (ArrayList<Person>) ois.readObject();
        for (Person obj : objs) {
            System.out.println(obj);
        }
    }

    /*
    * 打印流 PrintStream：
    + 只负责数据的输出，不负责数据的读取
    + 与其他的输出流不同，PrintStream**永远不会抛出IOException**
    + 有特有的方法，print，println
    + **注意**：如果使用继承自父类的write方法写数据，那么查看数据的时候会查询编码表 91-->a；  如果使用自己特有的方法print/println方法写数据，写的数据原样输出 97-->97 (查看源码很容易知道原因)
    + 可以改变输出语句的目的地（打印流的流向）。输出语句**默认在控制台输出**，使用`System.setOut()`方法改变输出语句的目的地为参数传递的    目的地。
     */
    private static void TestPrintStream() throws FileNotFoundException {
        System.out.write(97);   //这里会在控制台打印：a
        System.out.flush();   //注意：这里一定要调用flush方法才能显示在控制台，而print方法不用再调flush，因为其内部已经调用了
        System.out.println(97);    //这里控制台打印：97，因为其内部为：write(String.valueOf(i));

        //下面是改变输出语句的目的地（打印流的流向）
        System.out.println("我是在控制台输出");
        PrintStream ps = new PrintStream("another-stream.txt");
        System.setOut(ps);  //改变打印流的目的地
        System.out.println("我在另一个新的目的地中输出");
        ps.close();
    }
}
